package com.majie.resource;

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.util.FileCopyUtils;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * 资源获取demo
 *
 * @author majie
 */
public class ResourceDemo {
	public static void main(String[] args) throws IOException {

		//本地文件系统加载
		FileSystemResource resource1 = new FileSystemResource("D:\\test.txt");

		if (resource1.exists()) {
			//可以获取文件名和长度
			System.out.println(resource1.getFilename() + "的字节数是" + resource1.contentLength());

			//可以获取输入流
			InputStream in = resource1.getInputStream();
			//可以获取输出流, 因为FileSystemResource实现了WritableResource这个接口
			//实现这个接口的有 FileSystemResource, FileUrlResource, PathResource, 注意, 如果使用Resource类型则无法多态调用这个getOutPutStream()方法
			OutputStream out = resource1.getOutputStream();
			//可以获取File对象, 不过注意, 如果查找的文件实际上位于一个jar包中, 则getFile()会报异常, 因为不存在文件系统中的对应文件, 要读取该文件改用getInputStream打开输入流即可
			File textTxt = resource1.getFile();
			//可以在资源的相对地址上创建新文件
			Resource newFile = resource1.createRelative("text2.text");

		}

		//类路径加载, 所谓类路径, 就是寻找类的路径, 在WEB应用下是/lib和/WEB-INF/classes作为类路径, 而在普通程序里, 编译的程序包根目录就是类路径
		// 由于不是web应用, 在 src下创建一个 test2.html, 使用类路径加载器, 此时要用相对classpath的相对路径来写
		Resource resource2 = new ClassPathResource("test2.html");

		if (resource2.exists()) {
			System.out.println(resource2.getFilename() + "的字节数是" + resource2.contentLength());
			//也可以获取input, 无法获取output
			InputStream in2 = resource2.getInputStream();
			//也可以获取File对象
			File test2HTML = resource2.getFile();
			//还可以通过装饰器来指定编码, 这个装饰器可以直接获取字符流
			EncodedResource encodedResource = new EncodedResource(resource2, StandardCharsets.UTF_8);
			//FileCopyUtil是org.springframework.util提供的工具, 看来这个工具包也有不少东西可以用
			String content = FileCopyUtils.copyToString(encodedResource.getReader());
			System.out.println(content);

		}

		//还可以引用URL网络资源
		Resource resource3 = new UrlResource("https://www.baidu.com");
		if (resource3.exists()) {
			System.out.println(resource3.getURI());
		}



	}
}